#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 131100
int n,m,o[MAXN],a[MAXN],c[MAXN],t;
string s;
bool vh[18][MAXN];
template<typename T>
inline void read(T &num){
	num=0;short flag=1;char ch=getchar();
	while(!isdigit(ch)&&ch!='-') ch=getchar();
	if(ch=='-') ch=getchar(),flag=-1;
	while(isdigit(ch)) num=num*10+ch-'0',ch=getchar();
	num*=flag;
}
int main(){
	freopen("arena.in","r",stdin);
	freopen("arena.out","w",stdout);
	read(n),read(m);
	for(int i=1;i<=n;++i) read(o[i]);
	for(int i=1;i<=m;++i) read(c[i]);
	int K=ceil(log2(n));
	for(int i=1;i<=K;++i){
		cin>>s;for(int j=1;j<=(1<<K-i);++j) vh[i][j]=s[j-1]-'0';
	}read(t);
	int x[4];
	while(t--){
		for(int i=0;i<4;++i) read(x[i]);
		for(int i=1;i<=n;++i) a[i]=o[i]^x[i%4];
		ll ans=0;
		for(int i=1;i<=m;++i){
			ll A=0;int KK=ceil(log2(c[i]));
			vector<vector<int>>spt(1<<KK),jev;
			for(int j=0;j<(1<<KK);++j) spt[j].push_back(j+1);
			for(int R=1;R<=KK;++R){
				jev.clear();jev.resize((1<<KK-R));
				for(int G=0;2*G<spt.size();++G)
					if(!vh[R][G+1]){
						bool flag=false;
						for(int j=0;j<spt[2*G].size();++j)
							if(spt[2*G][j]>c[i]||a[spt[2*G][j]]>=R)
								jev[G].push_back(spt[2*G][j]);
							else flag=true;
						if(flag) for(int j=0;j<spt[2*G+1].size();++j)
							jev[G].push_back(spt[2*G+1][j]);
					}else{
						bool flag=false;
						for(int j=0;j<spt[2*G+1].size();++j)
							if(spt[2*G+1][j]>c[i]||a[spt[2*G+1][j]]>=R)
								jev[G].push_back(spt[2*G+1][j]);
							else flag=true;
						if(flag) for(int j=0;j<spt[2*G].size();++j)
							jev[G].push_back(spt[2*G][j]);
					}
				swap(spt,jev);
			}for(int j=0;j<spt[0].size();++j) A+=spt[0][j];
			ans^=i*A;
		}cout<<ans<<endl;
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}